#include "BlockQueue.hpp"
#include "Task.hpp"
#include <ctime>

int Multiply(int x, int y)
{
    return x * y;
}
void *Producer(void *args) // 生产者
{
    BlockQueue<Task> *bq = (BlockQueue<Task> *)args; // 执向临界资源BlockQueue的指针
    while (true)
    {
        int x = rand() %10 +1;
        usleep(rand()%1000);
        int y = rand()%20+1;

        Task t(x,y,Multiply);
        bq->push(t);
        std::cout << "生产了一个任务 " << x << " * " << y << " = " << " ? " << std::endl;
        sleep(1);
    }
    return nullptr;
}

void *Consumer(void *args) // 消费者
{
    BlockQueue<Task> *bq = (BlockQueue<Task> *)args; // 执向临界资源BlockQueue的指针
    while (true)
    {
        Task t;
        bq->pop(&t);
        std::cout << "消费了一个任务 " << t.x_ << " * " << t.y_ << " = " << t() << std::endl;
        //sleep(1);
    }
    return nullptr;
}
int main()
{
    srand((uint64_t)time(nullptr)^ getpid() ^ 0x555);
    pthread_t t1, t2;                                  // 定义线程ID
    pthread_mutex_t mtx;                               // 定义互斥锁
    BlockQueue<Task> *bQueue = new BlockQueue<Task>(); // 创建要传入的参数，参数是临界资源

    pthread_create(&t1, nullptr, Producer, bQueue); // 创建生产者线程执行Producer
    pthread_create(&t2, nullptr, Consumer, bQueue); // 创建消费者线程执行Consumer

    // while(true)
    // {
    //     //std::cout << "main" << std::endl;
    // }
    pthread_join(t1, nullptr); // 终止进程,等待线程退出，获取退出码
    pthread_join(t2, nullptr);

    delete bQueue;

    return 0;
}